【学习笔记】大指数的两种处理方法 | 您所在的位置:网站首页 › 欧拉公式 应用 › 【学习笔记】大指数的两种处理方法 |
问题背景
【描述】 对于算法欧拉降幂,你需要知道的东西有: 1、欧拉函数 ※※※ 2、快速幂 对于欧拉函数的实现,我会分为两个部分去阐述。 首先给出核心公式 欧拉降幂公式
【定义】 欧拉函数:1~N中与N互质的数的个数 其计算公式为 【证明】 点我看证明(视频) 【欧拉函数代码】 即实现上述公式 ll EulerFcuntion(ll p) //欧拉函数 { ll EulerNumber=p; for(ll i=2;i //如果是质因数 EulerNumber=EulerNumber/i*(i-1); //欧拉公式计算 while(p%i==0) p/=i; //除去相同质因数 } } if(p>1) EulerNumber=EulerNumber/p*(p-1); //最后一个质因数 return EulerNumber; }【可能问题解释】 1、外层 for 循环是什么意思? for(ll i=2;i ll EulerNumber=EulerFcuntion(p); //得到φ(c) ll len=strlen(y); ll DescendingPower=0; for(ll i=0;i ll result=1; while(power>0){ if(power&1) result=result*base%mod; power>>=1; base=(base%mod)*(base%mod); //底数平方 } return result; } ll EulerFcuntion(ll p) //欧拉函数 { ll EulerNumber=p; for(ll i=2;i EulerNumber=EulerNumber/i*(i-1); while(p%i==0) p/=i; } } if(p>1) EulerNumber=EulerNumber/p*(p-1); //最后一个质因数 return EulerNumber; } ll EulerDropPower(ll x,char y[],ll p) { ll EulerNumber=EulerFcuntion(p); //得到φ(p) ll len=strlen(y); ll DescendingPower=0; for(ll i=0;i int t; scanf("%d",&t); while(t--){ ll x,p; scanf("%lld%s%lld",&x,y,&p); ll ans=EulerDropPower(x,y,p); printf("%lld\n",ans); } return 0; }现在介绍第二种处理方法(虽然是我自己取的名字)——数学模拟 【推导】 ( 解释水平有限,没看懂可以私信我~ ) AC代码 2 #include #include using namespace std; typedef long long ll; int main() { int t; scanf("%d",&t); while(t--){ ll x; string y; ll p; ll ans=1; cin>>x>>y>>p; for(int i=y.size()-1;i>=0;i--){ int t=y[i]-'0'; for(int j=1;j |
CopyRight 2018-2019 实验室设备网 版权所有 |